信号量其实就是将异步执行变成了同步执行

信号量和锁其实差不多,锁每一次允许一个进程对数据进行修改,而信号量每次允许 num 个进程对数据进行修改

信号量了解就可以了

from multiprocessing import Semaphore


sem = Semaphore(4)  # 每次允许4个进程同时进来
sem.acquire()  # 上锁
print(0)
sem.acquire()  # 上锁
print(1)
sem.acquire()  # 上锁
print(2)
sem.acquire()  # 上锁
print(3)
# sem.release()  # 解锁,如果一个都没有解锁后面的进程是无法进来的
sem.acquire()  # 上锁
print(4)

1. 迷你唱吧例子

  • 假设商场里有4个迷你唱吧,所以同时可以进去4个人,如果来了第五个人就要在外面等待,等到有人出来才能再进去玩。

import time
import random
from multiprocessing import Semaphore
from multiprocessing import Process


def sing(i, sem):
    sem.acquire()  # 上锁,如果已经进入了4个进程,其他进程就无法进入
    print('%s : 进来KTV' % i)
    time.sleep(random.randint(1, 10))  # 随机延时1-10秒之间
    print('%s : 离开KTV' % i)
    sem.release()  # 解锁,允许下一个等待的进程进入

if __name__ == '__main__':
    sem = Semaphore(4)  # 每次允许4个进程进入
    for i in range(20):
        p = Process(target=sing, args=(i, sem))
        p.start()